;
;GEOS macros
;reassembled for 6502TASM/MMS by Maciej 'YTM/Elysium' Witkowiak
;4-2-99

;28-6-99 - ca65 port
;macro 'sub' renamed to 'ssub' due to 65816 mnemonics

;-------------------------------------------------------------------------

.macro  LoadB dest, value
        lda #value
        sta dest
.endmacro

;-------------------------------------------------------------------------

.macro  LoadW dest, value
        LoadB dest+1, >(value)
        LoadB dest+0, <(value)
.endmacro

;-------------------------------------------------------------------------

.macro  MoveB source, dest
        lda source
        sta dest
.endmacro

;-------------------------------------------------------------------------

.macro  MoveW source, dest
        MoveB source+1, dest+1
        MoveB source+0, dest+0
.endmacro

;-------------------------------------------------------------------------

.macro  add source
        clc
        adc source
.endmacro

;-------------------------------------------------------------------------

.macro  AddB source, dest
        lda source
        add dest
        sta dest
.endmacro

;-------------------------------------------------------------------------

.macro  AddW source, dest
        AddB source+0, dest+0
        lda source+1
        adc dest+1
        sta dest+1
.endmacro

;-------------------------------------------------------------------------

.macro  AddVB value, dest
        lda dest
        clc
        adc #(value)
        sta dest
        .endmacro

;-------------------------------------------------------------------------

.macro  AddVW value, dest
.local Skip
        AddVB <(value), dest+0
        .if (>(value))=0
            bcc Skip
            inc dest+1
        .else
            lda #>(value)
            adc dest+1
            sta dest+1
        .endif
Skip:
.endmacro

;-------------------------------------------------------------------------

.macro  ssub source
        sec
        sbc source
.endmacro

;-------------------------------------------------------------------------

.macro  SubB source, dest
        lda dest
        ssub source
        sta dest
.endmacro

;-------------------------------------------------------------------------

.macro  SubW source, dest
        SubB source+0, dest+0
        lda dest+1
        sbc source+1
        sta dest+1
.endmacro

;-------------------------------------------------------------------------

.macro  SubVW value, dest
        sec
        lda dest+0
        sbc #<(value)
        sta dest+0
        lda dest+1
        sbc #>(value)
        sta dest+1
.endmacro

;-------------------------------------------------------------------------

.macro  CmpB source, dest
        lda source
        cmp dest
.endmacro

;-------------------------------------------------------------------------

.macro  CmpBI source, immed
        lda source
        cmp #(immed)
.endmacro

;-------------------------------------------------------------------------

.macro  CmpW source, dest
.local Skip
        CmpB source+1, dest+1
        bne Skip
        CmpB source+0, dest+0
Skip:
.endmacro

;-------------------------------------------------------------------------

.macro  CmpWI source, immed
.local Skip
        CmpBI source+1, >(immed)
        bne Skip
        CmpBI source+0, <(immed)
Skip:
.endmacro

;-------------------------------------------------------------------------

.macro  PushB source
        lda source
        pha
.endmacro

;-------------------------------------------------------------------------

.macro  PushW source
        PushB source+1
        PushB source+0
.endmacro

;-------------------------------------------------------------------------

.macro  PopB dest
        pla
        sta dest
.endmacro

;-------------------------------------------------------------------------

.macro  PopW dest
        PopB dest+0
        PopB dest+1
.endmacro

;-------------------------------------------------------------------------

.macro  smb bitNumber, dest
        pha
        lda #(1 << bitNumber)
        ora dest
        sta dest
        pla
.endmacro

;-------------------------------------------------------------------------

.macro  smbf bitNumber, dest
        lda #(1 << bitNumber)
        ora dest
        sta dest
.endmacro

;-------------------------------------------------------------------------

.macro  rmb bitNumber, dest
        pha
        lda #(1 << bitNumber) ^ $ff
        and dest
        sta dest
        pla
.endmacro

;-------------------------------------------------------------------------

.macro  rmbf bitNumber, dest
        lda #(1 << bitNumber) ^ $ff
        and dest
        sta dest
.endmacro

;-------------------------------------------------------------------------

.macro  bbs bitNumber, source, addr
.local Skip
        php
        pha
        lda source
        and #(1 << bitNumber)
        beq Skip
        pla
        plp
        bra addr
Skip:   pla
        plp
.endmacro

;-------------------------------------------------------------------------

.macro  bbsf bitNumber, source, addr
        .if     bitNumber=7
                bit source
                bmi addr
        .else
                .if bitNumber=6
                    bit source
                    bvs addr
                .else
                    lda source
                    and #(1 << bitNumber)
                    bne addr
                .endif
        .endif
.endmacro

;-------------------------------------------------------------------------

.macro  bbr bitNumber, source, addr
.local Skip
        php
        pha
        lda source
        and #(1 << bitNumber)
        bne Skip
        pla
        plp
        bra addr
Skip:   pla
        plp
.endmacro

;-------------------------------------------------------------------------

.macro  bbrf bitNumber, source, addr
        .if bitNumber=7
            bit source
            bpl addr
        .else
                .if bitNumber=6
                    bit source
                    bvc addr
                .else
                    lda source
                    and #(1 << bitNumber)
                    beq addr
                .endif
        .endif
.endmacro

;-------------------------------------------------------------------------

;03.03.99 by Maciej Witkowiak

;-------------------------------------------------------------------------

.macro  addv value
        clc
        adc #(value)
.endmacro

;-------------------------------------------------------------------------

.macro  subv value
        sec
        sbc #(value)
.endmacro

;-------------------------------------------------------------------------

.macro  bnex addr
        txa
        bne addr
.endmacro

;-------------------------------------------------------------------------

.macro  beqx addr
        txa
        beq addr
.endmacro

;-------------------------------------------------------------------------
